/**********************************************************************
 Name:  RouteMapControl
 Purpose:Trad 店面拜访地图相关数据处理                                                            
-------                                                             
======================================================
History                                                            
-------                                                            
VERSION    AUTHOR                  DATE                 DETAIL                                
   1.0 -        huangxiaojiang       03/15/2011         Create  
*********************************** ************************************/

public with sharing class RouteMapControl{
 
    //Variables
    string strRPVId='';
    set<id> setAccountId=null;
    list<RoutingPlan__c> lRoutingPlan=null;
    list<Account> lPlanOutlet=null;
    map<id,Account> mapPlanOutlet=null;
    list< In_Store_Visit__c> lVisitISV=null;
    map<id,Account> mapOutlet=null;
    
      // getter & setter methods
      public string RPVId {
         get;
         set;
      }
      
      //计划拜访坐标值
      public string PlanAddress{
          get;
          set;
      }
      //计划拜访所有店面名称
      public string PlanOutletNames{
          get;
          set;
      }
      //实际拜访坐标值
      public string VisitAddress{
          get;
          set;
      }
      //实际拜访所有店面名称
      public string VisitOutletNames{
          get;
          set;
      }
      //是否异常标识数组
      public string ExceptionArray{
          get;
          set;
      }
      //拜访距离
      public string RangeValues{
          get;
          set;
      }
      
      //计划坐标点的实际位置
      public string PlanOrder{
          get;
          set;
      }
      
      //放置一个合适的门店地址用于初始化地图
      public string   outletAddress{
          get;
          set;
      }  
    
     // Constructors
     public  RouteMapControl(ApexPages.StandardController controller){

      }
      
       public PageReference pageLoadAction(){
         
         if(RPVId!=null){
             strRPVId=RPVId;
         }else{
             strRPVId=System.currentPageReference().getParameters().get('id');//获取当前页面的routingPlan and Visit记录的id
         }
         
          lRoutingPlan=[select OutletName__c from RoutingPlan__c where RoutingPlanAndVisit__c=:strRPVId order by StartDateTime__c asc] ;
          setAccountId=new set<id>();
          for(RoutingPlan__c rp:lRoutingPlan) {
               setAccountId.add(rp.OutletName__c);
          }
          
          //如果路线计划有店面数据
          if(setAccountId.size()>0){
              
              mapPlanOutlet=new map<id,Account>((list<Account>)[select id,Name,lat__c,lon__c,Outlet_Address__c from Account where id in:setAccountId]);
              
              string strTemp='';
              string strTemp5='';
              string strPlanOrder='';
              
              string strOutletId='';
              Account objAcc=new Account();
              
              //如果计划路线不同门店有相同坐标，为了不重叠，纬度手工偏移：偏移基数0.0003，相同递增0.0002
              double dBasePoint=0.0003;
              double dIncreasePoint=0.0002;
              integer iRate=0;
              string strOutletId1='';
              Account objAcc1=new Account();
              
              for(integer i=0; i<lRoutingPlan.size()-1;i++){
                  strOutletId=lRoutingPlan[i].OutletName__c;
                  objAcc=mapPlanOutlet.get(strOutletId);
                  
                  if(objAcc!=null){
                  
                  //门店地址赋值
                  if(OutletAddress==null||OutletAddress==''){
                      OutletAddress=objAcc.Outlet_Address__c;    
                  }
                  
                      if(objAcc.lat__c!=null&&objAcc.lon__c!=null){
                           for(integer j=i+1;j<lRoutingPlan.size();j++){
                              strOutletId1=lRoutingPlan[j].OutletName__c;
                              objAcc1=mapPlanOutlet.get(strOutletId1);
                              if(objAcc1!=null){
                                  if(objAcc1.lat__c!=null&&objAcc1.lon__c!=null){
                                      if(objAcc.lat__c==objAcc1.lat__c&&objAcc.lon__c==objAcc1.lon__c){
                                          objAcc1.lon__c=string.valueOf(double.valueOf(objAcc1.lon__c)+dBasePoint+iRate*dIncreasePoint);
                                          iRate++;
                                      }                                  
                                  }

                              }                           
                          }                                               
                      }
          
                  }
                  
                  iRate=0;//复位0                    
                                 
              }              
              
              for(integer i=0; i<lRoutingPlan.size();i++){             
                 strOutletId=lRoutingPlan[i].OutletName__c;
                  objAcc=mapPlanOutlet.get(strOutletId);
                  if(objAcc!=null){
                       if(objAcc.lat__c!=null&&objAcc.lat__c!=null){
                          strTemp+=objAcc.lat__c+','+objAcc.lon__c+';';
                          strTemp5+=objAcc.Name+';'; 
                          strPlanOrder+=string.valueOf(i)+';';                         
                      }                 
                  }

              }
              
              if(strTemp!=''&&strTemp.contains(';')){
                  strTemp=strTemp.substring(0,strTemp.length()-1);
              }
              if(strTemp5!=''&&strTemp5.contains(';')){
                  strTemp5=strTemp5.substring(0,strTemp5.length()-1);
              }
              if(strPlanOrder!=''&&strPlanOrder.contains(';')){
                  strPlanOrder=strPlanOrder.substring(0,strPlanOrder.length()-1);
              }              
              PlanAddress=strTemp;
              PlanOutletNames=strTemp5;
              PlanOrder=strPlanOrder;
              
          }
          
          //获取实际店面拜访坐标数据
          lVisitISV=[select id, lat__c,lon__c,isException__c,OutletName_del__c,devRange__c from In_Store_Visit__c 
              where RoutingPlanAndVisit__c=:strRPVId and jobItems__c=:null order by Start_Time__c asc];
          setAccountId.clear();
        
          string strTemp2='';
          string strTemp3='';
          string strTemp4='';
          string strTemp6='';
          
          if(lVisitISV.size()>0){
              for(In_Store_Visit__c i:lVisitISV){
                      setAccountId.add(i.OutletName_del__c);
              }
              //if(setAccountId.size()>0){
                  mapOutlet=new map<id,Account>((list<Account>)[select id, Name,lat__c,lon__c,Outlet_Address__c from Account where id in:setAccountId]);
              //}                
              string strOutletId2='';
              Account objAcc2=new Account();
              string strOutletId3='';
              Account objAcc3=new Account();
              In_Store_Visit__c oISV1=new  In_Store_Visit__c();
              In_Store_Visit__c oISV2=new In_Store_Visit__c();       
              
              for(integer i=0; i<lVisitISV.size(); i++){                              
                  oISV1=lVisitISV[i];
                  strOutletId2=oISV1.OutletName_del__c;
                  objAcc2=mapOutlet.get(strOutletId2);
                  double dBasePoint=0.0003;
                  double dIncreasePoint=0.0002;
                  integer iRate=0;
                  integer iRate1=0;
                  
                  //对实际路线不同门店出现相同坐标进行手工偏移，偏移方法如计划路线。偏移包括实际路线和实际路线对应的门店                
                  if(objAcc2!=null){
                      //门店地址赋值
                      if(OutletAddress==null||OutletAddress==''){
                          OutletAddress=objAcc2.Outlet_Address__c;    
                      } 
                                       
                      if(objAcc2.lat__c!=null&&objAcc2.lon__c!=null){
                           for(integer j=i+1;j<lVisitISV.size();j++){
                                
                                //处理相同门店
                               strOutletId3=lVisitISV[j].OutletName_del__c;
                               objAcc3=mapOutlet.get(strOutletId3);
                               if(objAcc3!=null){
                                   if(objAcc3.lat__c!=null&&objAcc3.lon__c!=null){
                                       if(objAcc2.lat__c==objAcc3.lat__c&&objAcc2.lon__c==objAcc3.lon__c){
                                          objAcc3.lon__c=string.valueOf(double.valueOf(objAcc3.lon__c)+dBasePoint+iRate*dIncreasePoint);
                                          iRate++;        
                                       }
                                   }
                               }
                               
                               //处理相同的拜访数据
                               oISV2=lVisitISV[j];
                               if(oISV1.lat__c!=null&&oISV1.lon__c!=null&&oISV2.lat__c!=null&&oISV2.lon__c!=null){
                                   if(oISV1.lat__c==oISV2.lat__c&&oISV1.lon__c==oISV2.lon__c){
                                        oISV2.lon__c=string.valueOf(double.valueOf(oISV2.lon__c)+dBasePoint+iRate1*dIncreasePoint);
                                         iRate1++;                                      
                                   }                               
                               }

                               
                          }
                       
                      }
             
                  }                 
                  iRate=0;//复位 
                  iRate1=0;                    
                  
                  if(objAcc2!=null){
                      if(lVisitISV[i].lat__c!=null&&lVisitISV[i].lon__c!=null&&objAcc2.lat__c!=null&&objAcc2.lon__c!=null){
                          //正常拜访时使用对应门店标准坐标                               
                          if(lVisitISV[i].isException__c==0){                    
                           //当计划拜访跟实际拜访地址基本一致，为了避免重叠，把实际拜访店面统一按纬度偏移一定度数0.0005
                           double dLat=double.valueOf(objAcc2.lat__c);
                           dLat=dLat+0.0005;                          
                           strTemp2+=string.valueOf(dLat)+','+objAcc2.lon__c+';';                               
                          }else{//异常或计划外拜访使用本记录坐标
                               
                               strTemp2+=lVisitISV[i].lat__c+','+lVisitISV[i].lon__c+';';
                          }
                         
                          strTemp3+=lVisitISV[i].isException__c+';';
                          strTemp4+=lVisitISV[i].devRange__c+';';
                          strTemp6+=objAcc2.name+';';

                      }else{
                          //拜访有坐标，门店没坐标
                          if(lVisitISV[i].lat__c!=null&&lVisitISV[i].lon__c!=null&&objAcc2.lat__c==null&&objAcc2.lon__c==null){
                              strTemp2+=lVisitISV[i].lat__c+','+lVisitISV[i].lon__c+';';
                              strTemp3+='0;';
                              strTemp4+='0;';
                              strTemp6+=objAcc2.name+';';                              
                          }
                      }                  
                  }


              }
          }
          
          if(strTemp2!=''&&strTemp2.contains(';')){
              strTemp2=strTemp2.substring(0,strTemp2.length()-1);
           }
           if(strTemp3!=''&&strTemp3.contains(';')){
              strTemp3=strTemp3.substring(0,strTemp3.length()-1);
           }
           if(strTemp4!=''&&strTemp4.contains(';')){
              strTemp4=strTemp4.substring(0,strTemp4.length()-1);
           }
           if(strTemp6!=''&&strTemp6.contains(';')){
              strTemp6=strTemp6.substring(0,strTemp6.length()-1);
           }                      
          VisitAddress=strTemp2;
          ExceptionArray=strTemp3;
          RangeValues=strTemp4;
          VisitOutletNames=strTemp6;
          
          return null;
       }
       

}